package org.tri.entity;

import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

/**
 * La clase {@code Animal} representa un animal con su respectiva caravana. 
 * Solo los animales que poseen una caravana son considerados en el modelo.
 * Cada animal es generado solo cuando se realiza una compra que lo incluye.
 * @author kiira
 * @version 1.0, Nov 16, 2011
 */
@Entity
@Table ( name = "animal" )
public class Animal extends AbstractAnimal {

    /** Compra en la cual este animal fué asignado. */
    private Compra compra;
    /** Venta en la que este animal participó. */
    private Venta venta;

    /**
     * Constructor sin parámetros utilizado por hibernate.
     */
    protected Animal() {
    }//end constructor

    /**
     * Constructor que inicializa el animal dado su número de caravana
     * y la compra asociada donde se obtuvo al animal.
     * @param caravana caravana del animal.
     * @param compra compra donde se obtuvo al animal.
     */
    public Animal( String caravana, Compra compra ) {
        super( caravana );
        this.compra = compra;

    }//end constructor  

    /**
     * Devuelve la {@code Compra} en la cual este animal fué adquirido.
     * @return {@code Compra} asociada al animal.
     */
    @ManyToOne ( cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, optional = false )
    @JoinColumn ( name = "compra" )
    @Cascade ( org.hibernate.annotations.CascadeType.SAVE_UPDATE )
    @Fetch ( FetchMode.SELECT )
    public Compra getCompra() {
        return compra;

    }//end método getCompra

    /**
     * Setea la {@code Compra} en la que se realizó la adquisición del
     * animal. Para uso exclusivo de hibernate.
     * @param compra {@code Compra} a setear.
     */
    protected void setCompra( Compra compra ) {
        this.compra = compra;

    }//end método setCompra

    /**
     * {@inheritDoc}
     */
    @Override
    public AbstractCompra obtenerCompraActual() {
        return getCompra();

    }//end método obtenerCompraActual

    /**
     * Devuelve la {@code Venta} en la cual este animal fué vendido.
     * @return {@code Venta} asociada al animal.
     */
    @ManyToOne ( cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, optional = true )
    @JoinColumn ( name = "venta" )
    @Cascade ( org.hibernate.annotations.CascadeType.SAVE_UPDATE )
    @Fetch ( FetchMode.SELECT )
    public Venta getVenta() {
        return venta;

    }//end método getVenta

    /**
     * Setea la {@code Venta} en la este animal fué vendido.
     * @param venta {@code Venta} a setear.
     */
    public void setVenta( Venta venta ) {
        this.venta = venta;

    }//end método setVenta

    /**
     * {@inheritDoc}
     */
    @Override
    public AbstractVenta obtenerVentaActual() {
        return getVenta();

    }//end método obtenerVentaActual

}//end clase Animal

